package main.java.cris.view.console;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import main.java.cris.model.dao.ClienteDao;
import main.java.cris.model.dao.ProdutoDao;
import main.java.cris.model.dao.VendaDao;
import main.java.cris.model.entites.Cliente;
import main.java.cris.model.entites.Produto;
import main.java.cris.model.entites.Venda;

public class Menus {
    Scanner sc = new Scanner(System.in);

    public void show() {
        while (true) {
            System.out.println("Menu principal:");
            System.out.println("1 : cliente cadastro");
            System.out.println("2 : cliente listagem");
            System.out.println("3 : produto cadastro ");
            System.out.println("4 : produto listegem ");
            System.out.println("5 : venda cadastro");
            System.out.println("6 : venda listagem");
            System.out.println("7 : cliente tranferencia");
            System.out.println("8 : cliente deposito");
            System.out.println("9 : sair");
            System.out.println("Digite a opcao:");
            Integer entrada = null;
            try {
                entrada = Integer.parseInt(sc.next());
            } catch (NumberFormatException e) {
                exibeMensagem("Opcao invalida tente novamente.");
            }
            if (entrada == null) {
                continue;
            }
            switch (entrada) {
            case 1:
                CadastraCliente();
                break;
            case 2:
                VisualizarCliente();
                break;
            case 3:
                CadastraProduto();
                break;
            case 4:
                VisualizarProduto();
                break;
            case 5:
                CadastraVenda();
                break;
            case 6:
                VisualizarVenda();
                break;
            case 7:
                realizaTransferencia();
                break;
            case 8:
                realizaDeposito();
                break;
            case 9:
                System.exit(0);
            default:
                break;
            }
        }
    }

    private void exibeMensagem(String msg) {
        System.out.println(msg);
        System.out
            .println("Para continuar pressione qualquer tecla e pressione enter");
        sc.next();
    }

    public boolean CadastraCliente() {
        Cliente cli = new Cliente();
        System.out.println("==========");
        try {
            System.out.println("Matricula:");
            cli.setMatricula(Integer.parseInt(sc.next()));
            System.out.println("Nome");
            cli.setNome(sc.next());
            System.out.println("Email");
            cli.setEmail(sc.next());
            System.out.println("Valor em conta");
            cli.setSaldo(Float.parseFloat(sc.next()));
            ClienteDao.save(cli);
            exibeMensagem("Cliente cadastrado com sucesso");
            return true;
        } catch (NumberFormatException e) {
            exibeMensagem("O campo aceita apenas dado numerico");
        } catch (Exception e) {
            exibeMensagem(e.getMessage());
        }
        return false;
    }

    public void VisualizarCliente() {
        List<Cliente> clientes = ClienteDao.getClientes();
        System.out.println(String.format("%-20s", "MATRICULA") + "\t"
            + String.format("%-20s", "NOME") + "\t"
            + String.format("%-20s", "EMAIL") + "\t"
            + String.format("%-20s", "CONTA"));
        for (Cliente cli : clientes) {
            System.out.println(String.format("%-20s", cli.getMatricula())
                + "\t" + String.format("%-20s", cli.getNome()) + "\t"
                + String.format("%-20s", cli.getEmail()) + "\t"
                + String.format("%-20s", cli.getSaldo()));
        }
        exibeMensagem("Listagem concluida");
    }

    public boolean CadastraProduto() {
        Produto prod = new Produto();
        System.out.println("==========");
        try {
            System.out.println("codigo:");
            prod.setCodigo(Integer.parseInt(sc.next()));
            System.out.println("Nome");
            prod.setNome(sc.next());
            System.out.println("Tipo");
            prod.setTipo(sc.next());
            System.out.println("Preco");
            prod.setPreco(Float.parseFloat(sc.next()));
            System.out.println("Qtd estoque");
            prod.setQtd(Integer.parseInt(sc.next()));
            ProdutoDao.save(prod);
            exibeMensagem("Produto cadastrado com sucesso");
            return true;
        } catch (NumberFormatException e) {
            exibeMensagem("O campo aceita apenas dado numerico");
        } catch (Exception e) {
            exibeMensagem(e.getMessage());
        }
        return false;
    }

    public void VisualizarProduto() {
        List<Produto> produtos = ProdutoDao.getProdutos();
        System.out.println(String.format("%-20s", "CODIGO") + "\t"
            + String.format("%-20s", "NOME") + "\t"
            + String.format("%-20s", "PRECO") + "\t"
            + String.format("%-20s", "QTD"));
        for (Produto prod : produtos) {
            System.out.println(String.format("%-10s", prod.getCodigo()) + "\t"
                + String.format("%-20s", prod.getNome()) + "\t"
                + String.format("%-20s", prod.getPreco()) + "\t"
                + String.format("%-20s", prod.getQtd()));
        }
        exibeMensagem("Listagem concluida");
    }

    public boolean CadastraVenda() {
        Cliente cli;
        Produto prod;
        List<Venda> carrinho = new ArrayList<Venda>();
        Venda item;
        int parseInt;
        System.out.println("==========");
        try {
            System.out.println("Digite matricula cliente:");
            cli = ClienteDao.search(Integer.parseInt(sc.next()));
            if (cli == null) {
                throw new Exception("Cliente invalido");
            }
            while (true) {
                System.out
                    .println("Digite o codigo do produto ou 0 para terminar as compras");
                parseInt = Integer.parseInt(sc.next());
                if (parseInt == 0) {
                    break;
                }
                prod = ProdutoDao.search(parseInt);
                if (prod == null) {
                    throw new Exception("Produto invalido");
                }
                item = new Venda();
                item.setMatricula(cli.getMatricula());
                item.setCodigo(prod.getCodigo());
                System.out
                    .println("Quantos itens de produto " + prod.getNome());
                parseInt = Integer.parseInt(sc.next());
                if (parseInt == 0) {
                    continue;
                }
                item.setQtd(parseInt);
                item.setSubTotal(item.getQtd() * prod.getPreco());
                carrinho.add(item);
                exibeMensagem("Item adicionado no carrinho");
            }
            if (carrinho.size() > 0) {
                if (VendaDao.save(carrinho)) {
                    exibeMensagem("Compras realizada com sucesso");
                    return true;
                } else {
                    exibeMensagem("Falha ao realizar as compras");
                }
            } else {
                exibeMensagem("Nenhuma compra realizada");
            }
        } catch (NumberFormatException e) {
            exibeMensagem("O campo aceita apenas dado numerico");
        } catch (Exception e) {
            exibeMensagem(e.getMessage());
        }
        return false;
    }

    public void VisualizarVenda() {
        List<Venda> vendas = VendaDao.getVendas();        
        System.out.println(
            String.format("%-20s", "CDVENDA") + "\t"
            + String.format("%-20s", "NRSEQUENCIA") + "\t"
            + String.format("%-20s", "MATRICULA") + "\t"
            + String.format("%-20s", "CODIGO") + "\t"
            + String.format("%-20s", "QTD") + "\t"
            + String.format("%-20s", "SUBTOTAL")
            );
        for (Venda venda : vendas) {
            System.out.println(
                String.format("%-20s", venda.getCdvenda()) + "\t"
                + String.format("%-20s", venda.getNrsequencia()) + "\t"
                + String.format("%-20s", venda.getMatricula()) + "\t"
                + String.format("%-20s", venda.getCodigo()) + "\t"
                + String.format("%-20s", venda.getQtd()) + "\t"
                + String.format("%-20s", venda.getSubTotal())
                );
        }
        exibeMensagem("Listagem concluida");
    }
    
    public boolean realizaTransferencia() {
        Cliente cli1 = new Cliente();
        Cliente cli2 = new Cliente();
        System.out.println("==========");
        try {
            System.out.println("Digite a matricula de quem vai transferir:");
            cli1 = ClienteDao.search(Integer.parseInt(sc.next()));
            if (cli1 == null) {
                throw new Exception("Cliente invalido");
            }
            System.out.println("Digite a matricula de quem vai receber:");
            cli2 = ClienteDao.search(Integer.parseInt(sc.next()));
            if (cli2 == null) {
                throw new Exception("Cliente invalido");
            }
            System.out.println("Digite a qtd a transferir:");
            float valor = Float.parseFloat(sc.next());
            if (!(valor > 0)) {
                throw new Exception("Valor invalido");
            }
            if (ClienteDao.transferencia(cli1.getMatricula(), cli2.getMatricula(), valor)) {
                exibeMensagem("Transferencia com sucesso");
                return true;
            } else {
                exibeMensagem("Transferencia falhou");
            }
        } catch (NumberFormatException e) {
            exibeMensagem("O campo aceita apenas dado numerico");
        } catch (Exception e) {
            exibeMensagem(e.getMessage());
        }
        return false;
    }
    
    public boolean realizaDeposito() {
        Cliente cli1 = new Cliente();
        System.out.println("==========");
        try {
            System.out.println("Digite a matricula de quem vai receber:");
            cli1 = ClienteDao.search(Integer.parseInt(sc.next()));
            if (cli1 == null) {
                throw new Exception("Cliente invalido");
            }
            System.out.println("Digite a qtd a depositar:");
            float valor = Float.parseFloat(sc.next());
            if (!(valor > 0)) {
                throw new Exception("Valor invalido");
            }
            if (ClienteDao.deposito(cli1.getMatricula(), valor)) {
                exibeMensagem("Deposito com sucesso");
                return true;
            } else {
                exibeMensagem("Deposito falhou");
            }
        } catch (NumberFormatException e) {
            exibeMensagem("O campo aceita apenas dado numerico");
        } catch (Exception e) {
            exibeMensagem(e.getMessage());
        }
        return false;
    }

}
